从pandas中的datetime列减去一年

时间:2015-07-01 19:14:08

标签: python python-2.7 datetime pandas

我有一个datetime列,如下所示 -

>>> df['ACC_DATE'].head(2)
538   2006-04-07
550   2006-04-12
Name: ACC_DATE, dtype: datetime64[ns]

现在,我想从本专栏的每一行中减去一年。我怎样才能实现同样的目标我可以使用哪个库?

预期字段 -

        ACC_DATE    NEW_DATE
538   2006-04-07  2005-04-07
549   2006-04-12  2005-04-12

感谢。

4 个答案:

答案 0 :(得分:46)

您可以使用DateOffset来实现此目标:

<html>
<head>
<style>
#map {
  height: 400px;
  width: 700px;
  margin: 0px;
  padding: 0px
}
</style>

<script src="http://maps.google.com/maps/api/js?v=3&libraries=visualization,places,geometry" type="text/javascript"></script>
<script type="text/javascript">

var side_bar_html = "";
var gmarkers = [];
var myLatlng = new google.maps.LatLng(21.13962399, -86.8928956);
var panorama;
var myOptions = {
  zoom: 14,
  center: myLatlng,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};

function myclick(i) {
google.maps.event.trigger(gmarkers[i], "click");
}
var infoWindow = new google.maps.InfoWindow();
var bounds = new google.maps.LatLngBounds();

function createMarker(point, map, infoWindow, html, CompanyName) {
var marker = new google.maps.Marker({
  position: point,
  map: map,
  title: CompanyName
});
google.maps.event.addListener(marker, 'click', function() {
panorama = map.getStreetView();
panorama.setPosition(marker.getPosition());
google.maps.event.addListenerOnce(panorama, 'status_changed', function() {
  var heading = google.maps.geometry.spherical.computeHeading(panorama.getPosition(), marker.getPosition());
  panorama.setPov({
    heading: heading,
    zoom: 1,
    pitch: 0
  });
});
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
bounds.extend(point);
gmarkers.push(marker);
side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length - 1) + ')">' + CompanyName + '<\/a><br>';
return marker;
}

function initialize() {
var map = new google.maps.Map(document.getElementById("map"), myOptions);

var xmlDoc = xmlParse(xmlStr);
var markers = xmlDoc.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
  var CompanyName = markers[i].getAttribute("CompanyName");
  var CompanyDescription = markers[i].getAttribute("CompanyDescription");
  var CompanyTelephone = markers[i].getAttribute("CompanyTelephone");
  var NEWHEADING = parseFloat(markers[i].getAttribute("StreetView"));
  var point = new google.maps.LatLng(
    parseFloat(markers[i].getAttribute("lat")),
    parseFloat(markers[i].getAttribute("lng")));
    var html = "<H3>" + CompanyName + "</H3>" + CompanyDescription + "<BR>Tel: " + CompanyTelephone + "<BR><B>New Heading: " + NEWHEADING + "</B><BR>";
html += '<br /><input type="button" onclick="toggleStreetView();" value="See Street View" />';
    var marker = createMarker(point, map, infoWindow, html, CompanyName);
  }
document.getElementById("side_bar").innerHTML = side_bar_html;
map.fitBounds(bounds);
}
google.maps.event.addDomListener(window, 'load', initialize);

function toggleStreetView() {
  var toggle = panorama.getVisible();
  if (toggle === false) {
    panorama.setVisible(true);
  } else {
    panorama.setVisible(false);
  }
}

function xmlParse(str) {
if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
  var doc = new ActiveXObject('Microsoft.XMLDOM');
  doc.loadXML(str);
  return doc;
}

if (typeof DOMParser != 'undefined') {
  return (new DOMParser()).parseFromString(str, 'text/xml');
}

return createElement('div', null);
}
var xmlStr = '<?xml version="1.0" encoding="UTF-8"?><markers><marker CompanyName="MCDONALDS" CompanyDescription="Tasty Hamburgers To Go" lat="21.141406" lng="-86.83339" StreetView="15.26" CompanyTelephone="01 998 893 6767"/><marker CompanyName="LITTLE CAESARS" CompanyDescription="Best Pizzas Anywhere" lat="21.161016" lng="-86.850647" StreetView="233.56" CompanyTelephone="01 998 893 6767"/><marker CompanyName="VIPS" CompanyDescription="Tasty Food" lat="21.113087" lng="-86.838704" StreetView="320.13" CompanyTelephone="+52 998 843 6666"/></markers>';
</script>
</head>

<body>
<div style="border: 2px solid #3872ac;" id="map"></div>
<div id="side_bar"></div>
<p>Below are the real Streetview URL's with the same HEADING values that are passed to the variable "NEWHEADING"</p>
<a href="https://www.google.com.mx/maps/@21.141406,-86.83339,3a,75y,15.26h,90t/data=!3m4!1e1!3m2!1scugaDFoU9Zhym3_IwhMKgQ!2e0!4m2!3m1!1s0x0:0xfde8520f397fad4b!6m1!1e1">McDonalds</a>
<BR>
<a href="https://www.google.com/maps/@21.161016,-86.850647,3a,75y,233.56h,90t/data=!3m4!1e1!3m2!1sjODIp985qSnPK1noHruiCw!2e0!4m2!3m1!1s0x0:0xc90acf0749a704b!6m1!1e1">Caesars Pizza</a>
<BR>
<a href="https://www.google.com.mx/maps/@21.113087,-86.838704,3a,75y,320.13h,96.48t/data=!3m4!1e1!3m2!1sZWlO1UlMwAuqAL0zEYY_zQ!2e0!6m1!1e1">Vips</a>
</body>
</html>

<强>更新

3年后使用In [15]: df['NEW_DATE'] = df['ACC_DATE'].apply(lambda x: x - pd.DateOffset(years=1)) df Out[15]: ACC_DATE NEW_DATE index 538 2006-04-07 2005-04-07 550 2006-04-12 2005-04-12 查看此问题是不必要的,您可以这样做:

apply

这是一个矢量化操作

答案 1 :(得分:9)

您可以使用pd.Timedelta:

df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365) 

或替换:

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))

但两者都不会闰年,所以你可以使用dateutil.relativedelta

from dateutil.relativedelta import  relativedelta

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))

答案 2 :(得分:8)

使用DateOffset

df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12

答案 3 :(得分:0)

如果具有pd.Timestamp对象而不是列,

  1. 使用pd.DateOffset(years=n)并不理想,因为它会产生:

UserWarning:丢弃非零纳秒转换

  1. pd.Timedelta()不接受年份。

在这种情况下唯一适用于我的方法是pd.Timestamp.replace

t = pd.Timestamp.now()
t = t.replace(year=t.year - n)

answer by Padriac中已暗示了这一点,但需要进一步说明。